#ifndef __MY_HOT_HPP__
#define __MY_HOT_HPP__

#include <iostream>
#include "data.hpp"

extern cloud::DataManager* _data;

namespace cloud
{
    class HotManager
    {
    private:
        int _hot_time;//热点判断时间
        std::string _back_dir;//存放实际文件目录
        std::string _pack_dir;//存放压缩文件目录
        std::string _pack_suffix;//压缩文件后缀

    private:
        /*判断当前文件是否是热点文件   热点文件返回false,非热点文件返回true*/
        bool HotJudge(const std::string& file_path)
        {
            FileUtil fu(file_path);
            time_t last_atime=fu.LastATime();
            time_t cur_time=time(nullptr);
            if(cur_time-last_atime>_hot_time) return true;
            return false;
        }

    public:
        HotManager()
        {
            //1.读取配置信息,初始化相应字段
            Config* cfg=Config::GetInstance();
            _hot_time=cfg->GetHotTime();
            _back_dir=cfg->GetBackDir();
            _pack_dir=cfg->GetPackDir();
            _pack_suffix=cfg->GetPackFileSuffix();

            //2.创建存放实际文件目录和存放压缩文件目录
            FileUtil fu1(_back_dir);
            FileUtil fu2(_pack_dir);
            fu1.CreateDirectory();
            fu2.CreateDirectory();
        }

        /*定期检查将非热点文件压缩*/
        bool RunModule()
        {
            while(true)
            {
                //1.获取实际文件名
                std::vector<std::string> arry;
                FileUtil fu(_back_dir);
                if(fu.ScanDirectory(&arry)==false)
                {
                    printf("runmodule,scanf directory failed\n");
                    continue;
                }

                //2.判断文件是否是热点文件
                for(auto& iter:arry)
                {
                    if(HotJudge(iter)==false) continue;
                    
                    //3.获取文件备份信息
                    BackupInfo bi;
                    if(_data->GetOneByRealPath(iter,&bi)==false)
                    {
                        bi.NewBackupInfo(iter);//设置一个新的文件备份信息出来
                    }

                    //4.非热点文件压缩
                    FileUtil fu_tmp(iter);
                    fu_tmp.Compress(bi._pack_path);

                    //5.删除原文件
                    fu_tmp.Remove();
                    bi._pack_flag=true;
                    _data->Update(bi);
                }

                usleep(1000);//避免空目录始终循环检测，浪费资源
            }

            return true;
        }
    };
}

#endif